// src/utils/request.ts
import axios, {
  type AxiosRequestConfig,
  type AxiosResponse,
  type InternalAxiosRequestConfig,
} from 'axios'

// 创建 axios 实例
const service = axios.create({
  baseURL: '',
  timeout: 5000, // 请求超时时间
})

// 请求拦截器
service.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 在发送请求之前做些什么，比如加上 token
    const token = localStorage.getItem('token')
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`
    }

    return config
  },
  (error) => {
    // 请求错误处理
    return Promise.reject(error)
  },
)

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // 对响应数据做些什么
    return response.data // 直接返回响应的数据
  },
  (error) => {
    // 响应错误处理
    if (error.response) {
      // 服务器返回的错误响应
      const { status } = error.response
      if (status === 401) {
        // 例如 token 过期
        console.error('Token expired')
      }
      ElMessage.error(`${error.response.status} - ${error.response.data.message}`)
    }
    return Promise.reject(error)
  },
)

// 封装常用的请求方法
export const request = <T>(config: AxiosRequestConfig): Promise<T> => {
  return service(config)
}

// 封装 GET 请求
export const get = <T>(url: string, params?: Record<string, unknown>): Promise<T> => {
  return request<T>({ url, method: 'GET', params })
}

// 封装 POST 请求
export const post = <T>(url: string, data: Record<string, unknown> | FormData): Promise<T> => {
  return request<T>({ url, method: 'POST', data })
}

// 封装 PUT 请求
export const put = <T>(url: string, data: Record<string, unknown>): Promise<T> => {
  return request<T>({ url, method: 'PUT', data })
}

// 封装 DELETE 请求
export const remove = <T>(url: string, data?: Record<string, unknown>): Promise<T> => {
  return request<T>({ url, method: 'DELETE', data })
}
